// /**
//  * @param {number[]} nums
//  * @param {number} k
//  * @return {number}
//  */
//  var numSubarrayProductLessThanK = function(nums, k) {
//   if(k === 0) return 0;
//   let ret = 0;
//   for(let i = 0; i < nums.length; i++) {
//       let j = i;
//       let cal = 1;
//       while(j < nums.length) {
//           cal *= nums[j];
//           if(cal < k) {
//               ret ++;
//           } else {
//               break;
//           }
//           j++;
//       }
//   }
//   return ret;
// };

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
 var numSubarrayProductLessThanK = function(nums, k) {
  if(!k) return 0;
  let l = 0, r = 0;
  let ret = nums[r] < k ? 1 : 0;
  let cal = nums[r];
  while(l <= r && l < nums.length - 1) {
      if(cal < k) {
          while(r < nums.length - 1)  {
              r++;
              if (nums[r] >= k) {
                l = r = r + 1;
                cal = nums[r];
                nums[r] < k && ret ++;
                break;
              }
              cal *= nums[r];
              if(cal >= k) {
                break;
              }
              ret += r - l + 1;
          }
          if(l === r) {
            continue;
          }
          if(r === nums.length - 1 && cal < k) break;
          cal = cal / nums[l];
          l++;
          if (cal < k) {
            ret += (r - l + 1); 
          }      
      } else {
          cal = cal / nums[l];
          if(l === r) {
            l = r = r + 1;
            cal = nums[r];
            nums[r] < k && ret ++;
            continue;              
          }
          l++;
          if (cal < k) {
            ret += (r - l + 1); 
            if(r === nums.length - 1) break;
          }   
      }
  }
  // ret += (r - l) * (r - l + 1) / 2;
  return ret;
};

console.log(numSubarrayProductLessThanK(
    [2,1,4,9,6,5,10,5,6,1,7,10,2,3,10]
    , 423))

// 双指针法还未写出来

